package com.github.sbb.sherry.primitives.api;

/**
 * 规则定义
 */
public interface Rule extends Comparable<Rule> {

  int DEFAULT_PRIORITY = 0;

  /**
   * 相同名称的规则被认为是同一个规则
   */
  String name();

  void init();

  /**
   * 值越大 优先级越低
   */
  default int getPriority() {
    return DEFAULT_PRIORITY;
  }

  /**
   * 如果返回 true 则规则执行
   */
  boolean evaluate(Facts facts);

  /**
   * 规则执行代码
   */
  void execute(Facts facts) throws Exception;

  @Override
  default int compareTo(final Rule rule) {
    if (getPriority() < rule.getPriority()) {
      return -1;
    } else if (getPriority() > rule.getPriority()) {
      return 1;
    } else {
      return name().compareTo(rule.name());
    }
  }
}
